package com.zsrt.java.day20170102.lh.collegesorequerysystem;

import java.util.Scanner;


public class CollegeDemo {
	//用户数组
	static User[] users = new User[5];
	//用户的个数
	static int count=0;
	

	
	
	public static void main(String[] args) {
		start();
		
		
	}
	
	/**
	 * 程序入口
	 */
	public static void start(){
		Scanner sc=new Scanner(System.in);
		System.out.println("===================================================");
		System.out.println("===================================================");
		System.out.println("1.管理员入口,2.普通用户入口,3.退出");
		System.out.println("===================================================");
		System.out.println("===================================================");
		int role=sc.nextInt();
		switch (role) {
		case 1: admin();break;
		case 2: user();break;
		case 3:System.out.println("退出系统成功"); break;
		}
	}
	
	/**
	 * 退出方法
	 */
	public static void quit() {
		System.out.println("程序退出成功");
		
		
		
	}
	
	/**
	 * 普通用户入口
	 * 需求：
	 * 2.1 我的信息
		 *            输入准考证号码、密码后验证成功
		 *            2.1.1   查看个人信息包括分数
		 *            2.1.1   修改个人信息（分数、准考证号码不能修改）
		 *        2.2 查询本市(登录用户所在的城市)的总分状元
		 *        2.3 查询全国各个省份的状元
		 *        2.4 查询指定城市的状元
		 *        2.5 统计分析报表
		 *            2.5.1 查询各个省份500-600分的总人数并由高到低排列显示
		 *            2.5.2 查询各个省份过600分的总人数并由低到高排列显示

	 */
	public static void user() {
		Scanner sc=new Scanner(System.in);
		System.out.println("输入准考证号：");
		String ad=sc.next();
		System.out.println("输入密码");
		String adp=sc.next();
		if(ad.equals(adp)){
			System.out.println("登陆成功、、");
			boolean falg=true;
			while(falg){
				System.out.println("===================================================");
				System.out.println("===================================================");
				System.out.println("1 我的信息 、、");
				System.out.println("2 查询本市总分状元、、");
				System.out.println("3 查询全国各个省份的状元、、");
				System.out.println("4 查询指定城市的状元、、");
				System.out.println("5 统计分析报表、、");
				System.out.println("===================================================");
				System.out.println("===================================================");
				int ad1=sc.nextInt();
				
				switch (ad1) {
					case 1:personal(ad); break;
					case 2:cityNo1(ad); break;
					case 3:provinceNo1(); break;
					case 4:queryCityNo1(); break;
					case 5:statistics(); break;
				}
			}
		}
	}
	
	/**
	 * 统计分析报表
	 * 			1 查询各个省份500-600分的总人数并由高到低排列显示
	 *          2 查询各个省份过600分的总人数并由低到高排列显示
	 * 
	 */
	private static void statistics() {
		
		boolean falg=true;
		while(falg){
			Scanner sc=new Scanner(System.in);
			System.out.println("===================================================");
			System.out.println("===================================================");
			System.out.println("1.查询各个省份500-600分的总人数并由高到低排列显示：");
			System.out.println("2.查询各个省份过600分的总人数并由低到高排列显示：");
			System.out.println("3.返回上一层：");
			System.out.println("===================================================");
			System.out.println("===================================================");
			int sel=sc.nextInt();
			
			//查询各个省份500-600分的总人数并由高到低排列显示
			if(1==sel){
				
				//保存所有省份的数组
				String provinces[]=new String[count];
				int k=0;
				for(int i=0;i<count;i++){
					if("学生".equals(users[i].getRole()) && users[i].getProvince()!=null){
						
						String pro=users[i].getProvince();
						if(check(pro,provinces)){
							provinces[k]=pro;
							//有几个省
							k++;
						}
					}
				}
				//取出每个省的考生
				for(int i=0;i<k;i++){
					
					String pro=provinces[i];
					
					System.out.println(pro+"省，600~500的考生的名单如下：");
					
					//保存每个省的考生
					User[] gs = new User[count];
					
					//当前省的考生人数
					int x=0;
					
					for(int p=0;p<count;p++){
						
						//如果考生的省份等于对应的省份，存放到新的数组
						boolean xxx=users[p].getProvince().equals(pro);
						if(xxx){
							
							gs[x]=users[p];
							x=x+1;
						}
					}
				
					 double[] scores=new double[x];
					 
					 //排序后学生下标改变，在比较分数后取出下标
					 double[] scoresxb=new double[x];
					 
					//遍历当前省的考生的分数 
					for(int v=0;v<x;v++){
						scores[v]=gs[v].getChineseScore()+gs[v].getMathScore()+gs[v].getEnglishScore();
						scoresxb[v]=gs[v].getChineseScore()+gs[v].getMathScore()+gs[v].getEnglishScore();
					}
					
					//对分数进行排序,找到数组500~600分考生的下标
					sortScoreMaxToMin(scores,x);
					
					int gfxb=0;
					for(int v=0;v<x;v++){
						if(scores[v]<=600 && scores[v]>=500){
							
							//找到考生的位置
							for(int b=0;b<x;b++){
								if(scores[v]==scoresxb[b]){
									
									//打印出对应下标的考生 
									System.out.println("----》"+"名字："+gs[b].getName()+"\t"+"语文："+gs[b].getChineseScore()+"\t"+"数学："+gs[b].getMathScore()+"\t"+"英语："+gs[b].getEnglishScore()+"\t"+"总分："+scores[v]);
								}
							}
						}
					}
				}
				
				
				
				//查询各个省份过600分的总人数并由低到高排列显示
			}else if(2==sel){
				
				
				//保存所有省份的数组
				String provinces[]=new String[count];
				int k=0;
				for(int i=0;i<count;i++){
					if("学生".equals(users[i].getRole()) && users[i].getProvince()!=null){
						
						String pro=users[i].getProvince();
						if(check(pro,provinces)){
							provinces[k]=pro;
							//有几个省
							k++;
						}
					}
				}
				//取出每个省的考生
				for(int i=0;i<k;i++){
					
					String pro=provinces[i];
					
					System.out.println(pro+"省，超过600的考生的名单如下（由低到高）：");
					
					//保存每个省的考生
					User[] gs = new User[count];
					
					//当前省的考生人数
					int x=0;
					
					for(int p=0;p<count;p++){
						
						//如果考生的省份等于对应的省份，存放到新的数组
						boolean xxx=users[p].getProvince().equals(pro);
						if(xxx){
							
							gs[x]=users[p];
							x=x+1;
						}
					}
				
					 double[] scores=new double[x];
					 
					 //排序后学生下标改变，在比较分数后取出下标
					 double[] scoresxb=new double[x];
					 
					//遍历当前省的考生的分数 
					for(int v=0;v<x;v++){
						scores[v]=gs[v].getChineseScore()+gs[v].getMathScore()+gs[v].getEnglishScore();
						scoresxb[v]=gs[v].getChineseScore()+gs[v].getMathScore()+gs[v].getEnglishScore();
					}
					
					//对分数进行排序,找到数组大于600分考生的下标
					sortScoreMaxToMin(scores,x);
					
					int gfxb=0;
					
					//从末尾开始遍历
					for(int v=x-1;v>=0;v--){
						if(scores[v]>=600){
							
							//找到考生的位置
							for(int b=0;b<x;b++){
								if(scores[v]==scoresxb[b]){
									
									//打印出对应下标的考生 
									System.out.println("----》"+"名字："+gs[b].getName()+"\t"+"语文："+gs[b].getChineseScore()+"\t"+"数学："+gs[b].getMathScore()+"\t"+"英语："+gs[b].getEnglishScore()+"\t"+"总分："+scores[v]);
								}
							}
						}
					}
				}
				
				
			}else if(3==sel){
				break;
			}
				
				System.out.println();
				
				//是否循环
				System.out.println("是否继续查看y/n");
				String yn1=sc.next();
				if("y".equals(yn1)){
					falg=true;
				}else if("n".equals(yn1)){
					falg=false;
				}else{
					System.out.println("输入有误，默认不查询");
					falg=false;
				}
		}
	}
	
	/**
	 * 查看指定城市的状元
	 */
	private static void queryCityNo1() {
		
		boolean falg=true;
		Scanner sc=new Scanner(System.in);
		System.out.println("===================================================");
		System.out.println("===================================================");
		System.out.println("输入要查看的城市：");
		System.out.println("===================================================");
		System.out.println("===================================================");
		while(falg){
			
			String city=sc.next();
			int xb=SortByCity(city);
			if(xb==-1){
				System.out.println("没有这个城市的考生记录");
				break;
			}
			
			System.out.println("本市状元：");
				//打印学生详细信息
				queryByxiaobiao(xb);
				System.out.println();
			
			//是否循环
			System.out.println("是否继续查看y/n");
			String yn1=sc.next();
			if("y".equals(yn1)){
				falg=true;
			}else if("n".equals(yn1)){
				falg=false;
			}else{
				System.out.println("输入有误，默认不查询");
				falg=false;
			}
		}
		
		
	}
	
	
	/**
	 * 查看各省的状元
	 */
	private static void provinceNo1() {
		//全国各省的数组
		String[] pro=new String[count];
		int j=0;
		boolean falg=true;
		Scanner sc=new Scanner(System.in);
		while(falg){
			for(int i=0;i<count;i++){
				if ("学生".equals(users[i].getRole())&&users[i].getProvince()!=null){
					
					String pr=users[i].getProvince();
					if(check(pr,pro)){
						pro[j]=pr;
						j++;
					}
				}
			}
			
			for (int k = 0; k <j; k++) {
				
				//每取出一个省份，就求出该省的状元
				String pr=pro[k];
				double maxScore=0;
				int maxIndex=-1;
				
				//循环取出每一个用户
				for (int x = 0; x <count;x++) {
					if ("学生".equals(users[x].getRole()) && pr.equals(users[x].getProvince())) {
						User user=users[x]; 
						double userSumScore=user.getChineseScore()+user.getMathScore()+user.getEnglishScore();
						if (userSumScore>maxScore) {
							maxScore=userSumScore;
							maxIndex=x;
						}
					}
				}
				System.out.println(users[maxIndex].getProvince()+"省的状元是："+users[maxIndex].getName()+"--，总分："+maxScore);
			}
			
			//是否循环
			System.out.println("是否继续查看y/n");
			String yn1=sc.next();
			if("y".equals(yn1)){
				falg=true;
			}else if("n".equals(yn1)){
				falg=false;
			}else{
				System.out.println("输入有误，默认不查询");
				falg=false;
			}
		}
		
		
	}
	
	/**
	 * 查看全市状元
	 * @param cardNum 准考证号
	 */
	private static void cityNo1(String cardNum) {
		boolean falg=true;
		Scanner sc=new Scanner(System.in);
		while(falg){
			
			int i=searchCardNum(cardNum);
			
			//获得城市
			String city = users[i].getCity();
			int xb=SortByCity(city);
			
			System.out.println("本市状元：");
				//打印学生详细信息
				queryByxiaobiao(xb);
				System.out.println();
			
			//是否循环
			System.out.println("是否继续查看y/n");
			String yn1=sc.next();
			if("y".equals(yn1)){
				falg=true;
			}else if("n".equals(yn1)){
				falg=false;
			}else{
				System.out.println("输入有误，默认不查询");
				falg=false;
			}
		}
	}	

	
	/**
	 * 普通用户查看个人信息
	 */
	private static void personal(String cardNum) {
		
		boolean falg=true;
		while(falg){
			Scanner sc=new Scanner(System.in);
			System.out.println("===================================================");
			System.out.println("===================================================");
			System.out.println("1.查看个人信息：");
			System.out.println("2.修改个人信息：");
			System.out.println("3.返回上一层：");
			System.out.println("===================================================");
			System.out.println("===================================================");
			int sel=sc.nextInt();
			if(1==sel){
				int i=searchCardNum(cardNum);
				queryByxiaobiao(i);
			}else if(2==sel){
				int i=searchCardNum(cardNum);
				queryByxiaobiao(i);
				System.out.println();
				
				System.out.println("输入密码：");
				String pass=sc.next();
				System.out.println("输入名字：");
				String name=sc.next();
				System.out.println("输入年龄：");
				int age=sc.nextInt();
				System.out.println("输入省份：");
				String province=sc.next();
				System.out.println("输入城市：");
				String city=sc.next();
				System.out.println("输入联系电话：");
				String address=sc.next();
				double a=users[i].getChineseScore();
				double b=users[i].getMathScore();
				double c=users[i].getEnglishScore();
				String d=users[i].getCardNum();
				
				User u=new User(d,pass,name,age,province,city,address,a,b,c,"学生");
				users[i]=u;
				System.out.println();
			}else if(3==sel){
				break;
			}
				
				//是否循环
				System.out.println("是否继续查看y/n");
				String yn1=sc.next();
				if("y".equals(yn1)){
					falg=true;
				}else if("n".equals(yn1)){
					falg=false;
				}else{
					System.out.println("输入有误，默认不查询");
					falg=false;
				}
		}
		
	}

	/**
	 * 管理员入口
	 * 需求：
	 * 选择1.输入帐号和密码进入管理员界面 
	 *      1.1 录入考生信息 
	 *      1.2 修改考生信息
	 *      1.3 删除考生信息
	 *      1.4 查询考生信息 
	 *           1.4.1 根据户籍所在地查询
	 *           1.4.2 根据姓名查询
	 *           1.4.3 根据准考证号码查询
	 *           1.4.4 返回上一层
	 */
	public static void admin(){
		
		Scanner sc=new Scanner(System.in);
		System.out.println("输入管理员帐号");
		String ad=sc.next();
		System.out.println("输入管理员密码");
		String adp=sc.next();
		if(ad.equals(adp)){
			System.out.println("登陆成功、、");
			boolean falg=true;
			while(falg){
				System.out.println("===================================================");
				System.out.println("===================================================");
				System.out.println("1 录入考生信息 、、");
				System.out.println("2 修改考生信息、、");
				System.out.println("3 删除考生信息、、");
				System.out.println("4 查询考生信息、、");
				System.out.println("5 退出、、");
				System.out.println("===================================================");
				System.out.println("===================================================");
				int ad1=sc.nextInt();
				
				switch (ad1) {
					case 1:recoding(); break;
					case 2:change(); break;
					case 3:delete(); break;
					case 4:query(); break;
					case 5:start(); break;
				}
			}
		}
	}
	
	/**
	 * 管理员查询
	 */
	private static void query() {
		
		boolean falg=true;
		while(falg){
		Scanner sc=new Scanner(System.in);
		System.out.println("===================================================");
		System.out.println("===================================================");
		System.out.println("1 根据户籍所在地查询");
		System.out.println("2 根据姓名查询");
		System.out.println("3 根据准考证号码查询");
		System.out.println("4 返回上一层");
		System.out.println("===================================================");
		System.out.println("===================================================");
		int num = sc.nextInt();
		
		if(1==num){
			System.out.println("输入户籍所在地");
			String city=sc.next();
			queryByCity(city);
			}else if(2==num){
				System.out.println("输入姓名查询");
				String name=sc.next();
				queryByName(name);
				}else if(3==num){
					System.out.println("输入要查询的学生准考证号：");
					String cardNum=sc.next();
					int i=searchCardNum(cardNum);
					if(i==-1){
					System.out.println("该准考证的学生不存在");
					}else{
						//先查询出学生的详细信息
						queryByxiaobiao(i);
						}
					}
			//是否循环
			System.out.println("是否继续查询 y/n");
			String yn1=sc.next();
			if("y".equals(yn1)){
				falg=true;
			}else if("n".equals(yn1)){
				falg=false;
			}else{
				System.out.println("输入有误，默认不查询");
				falg=false;
			}
		
		}
	}

	/**
	 * 删除考生信息
	 */
	private static void delete() {
		
		boolean falg=true;
		while(falg){
			Scanner sc=new Scanner(System.in);
			System.out.println("输入要删除的学生准考证号：");
			String cardNum=sc.next();
			int i=searchCardNum(cardNum);
			if(i==-1){
				System.out.println("该准考证的学生不存在");
			}else{
				//先查询出学生的详细信息
				queryByxiaobiao(i);
				//
				System.out.println("是否真的要删除 y/n");
				String yn=sc.next();
				if("y".equals(yn)){
					
					deleteByxiaobiao(i);
					
				}else if("n".equals(yn)){
					delete();
	
				}else{
					System.out.println("输入有误，默认不删");
					delete();
				}
				//
				System.out.println("是否继续删除 y/n");
				String yn1=sc.next();
				if("y".equals(yn1)){
					falg=true;
				}else if("n".equals(yn1)){
					falg=false;
				}else{
					System.out.println("输入有误，默认不删除");
					falg=false;
				}
			}
		
		}
	}
	/**
	 * 修改考生信息
	 */
	private static void change() {
		
		boolean falg=true;
		while(falg){
			Scanner sc=new Scanner(System.in);
			System.out.println("输入要修改的学生准考证号：");
			String cardNum=sc.next();
			int i=searchCardNum(cardNum);
			if(i==-1){
				System.out.println("该准考证的学生不存在");
			}else{
				//先查询出学生的详细信息
				queryByxiaobiao(i);
				
				System.out.println("输入要修改的学生的密码：");
				String pass=sc.next();
				System.out.println("输入要修改的学生的名字：");
				String name=sc.next();
				System.out.println("输入要修改的学生的省份：");
				String province=sc.next();
				System.out.println("输入要修改的学生的语文：");
				double chineseScore=sc.nextDouble();
				System.out.println("输入要修改的学生的数学：");
				double mathScore=sc.nextDouble();
				System.out.println("输入要修改的学生的英语：");
				double englishScore=sc.nextDouble();
				
				User u=new User(cardNum, pass,name,province,chineseScore, mathScore, englishScore, "学生");
				users[i]=u;
				System.out.println("修改成功！");
				
				//
				System.out.println("是否继续修改 y/n");
				String yn=sc.next();
				if("y".equals(yn)){
					falg=true;
				}else if("n".equals(yn)){
					falg=false;
				}else{
					System.out.println("输入有误，默认退出");
					falg=false;
				}
				
			}
		}
		
		
	}
	
	/**
	 * 录入考生信息
	 */
	private static void recoding() {
		
		boolean falg=true;
		while(falg){
			Scanner sc=new Scanner(System.in);
			System.out.println("输入学生的准考证号：");
			String cardNum=sc.next();
			int i=searchCardNum(cardNum);
			if(i!=-1){
				System.out.println("该准考证已经存在");
				
			}else{
				
				System.out.println("输入学生的密码：");
				String pass=sc.next();
				System.out.println("输入学生的名字：");
				String name=sc.next();
				System.out.println("输入学生的年龄：");
				 int age=sc.nextInt();
				System.out.println("输入学生的省份：");
				String province=sc.next();
				System.out.println("输入学生的城市：");
				String city=sc.next();
				System.out.println("输入学生的电话：");
				String address=sc.next();
				System.out.println("输入学生的语文：");
				double chineseScore=sc.nextDouble();
				System.out.println("输入学生的数学：");
				double mathScore=sc.nextDouble();
				System.out.println("输入学生的英语：");
				double englishScore=sc.nextDouble();
				
				//录入学生信息
				User u=new User(cardNum, pass,name,age,province,city,address,chineseScore, mathScore, englishScore, "学生");
				users[count]=u;
				count++;
				System.out.println("录入成功！");
				
				//
				System.out.println("是否继续录入 y/n");
				String yn=sc.next();
				if("y".equals(yn)){
					falg=true;
				}else if("n".equals(yn)){
					falg=false;
				}else{
					System.out.println("输入有误，默认退出");
					falg=false;
				}
			}
		}
	}
	
	/**
	 * 查询准考证号
	 * @param cardNum 要查询的准考证号码
	 * @return 目标的下标
	 */
	public static int searchCardNum(String cardNum){
		int flag=-1;
		for(int i=0;i<count;i++){
			if(users[i].getCardNum().equals(cardNum)){
				flag=i;
				break;
			}
		}
		return flag;
	}
	
	/**
	 * 根据下标查询user详细信息
	 * @param i 准考证号查询后返回的下标
	 */
	public static void queryByxiaobiao(int i){
		String a1=users[i].getCardNum();
//		String a=users[i].getPass();
		String b=users[i].getName();
		int age=users[i].getAge();
		String c=users[i].getProvince();
		String city=users[i].getCity();
		String address=users[i].getAddress();
		double d=users[i].getChineseScore();
		double e=users[i].getMathScore();
		double f=users[i].getEnglishScore();
		System.out.println("准考证号为:"+a1+"\t"+"的学生的信息如下：");
//		System.out.println("密码:"+a);
		System.out.println("名字:"+b);
		System.out.println("年龄:"+age);
		System.out.println("省份："+c);
		System.out.println("城市："+city);
		System.out.println("联系方式："+address);
		System.out.println("语文成绩:"+d);
		System.out.println("数学成绩:"+e);
		System.out.println("英语成绩:"+f);
		System.out.println();
	}
	
	/**
	 *根据查找到的下标删除对象 
	 * @param i 要删除的下标
	 */
	public static void deleteByxiaobiao(int i){
		for(int j=i;i<count-1;j++){
			users[j]=users[j+1];
		}
		count--;
		users[count]=null;
	}
	
	
	
	/**
	 * 城市下的学生
	 * @param st 要查询的城市
	 *
	 */
	public static void queryByCity(String st){
		
		
		for(int i=0;i<count;i++){
			System.out.println(i);
			if(st.equals(users[i].getCity())){
				queryByxiaobiao(i);
			}
		}
	}

	/**
	 * 名字
	 * @param st 要查询的名字
	 *
	 */
	public static void queryByName(String st){
		
		for(int i=0;i<count;i++){
			if(st.equals(users[i].getName())){
				queryByxiaobiao(i);
			}
		}
	}
	
	
	/**
	 * 按城市排序分数
	 * @param city 要查询的城市名
	 * @return   最高分的下标 （同分）
	 */
	public static int SortByCity(String city){
		
		int j=0;
		double[] temp=new double[count];
		double[] temp1=new double[count];
		for(int i=0;i<count;i++){
			if(users[i].getCity().equals(city)){
			double top=users[i].getChineseScore()+users[i].getMathScore()+users[i].getEnglishScore();
			temp[i]=top;
			temp1[i]=top;
			}
		}
		//对登陆城市的学生进行分数排序
		double a=sortScore(temp);
		
		//查找到最高分学生的下标
		for(int i=0;i<count;i++){
			if(a==temp1[i]){
				j=i;
				return j;
			}
		}
		return j;
		
	}
	
	

	/**
	 * 01 02 03    0123
	 * 12 13 
	 * 23
	 */
	//对总分数 进行选择排序  
	/**
	 * 返回最高分数
	 * @param temp 要排序数组
	 * @return 最高分数
	 */
	public static double sortScore(double[] temp){
		
		for(int i=0;i<count-1;i++){
			for(int j=i+1;j<count;j++){
				double falg=0;
				if(temp[i]<temp[j]){
					falg=temp[i];
					temp[i]=temp[j];
					temp[j]=falg;
				}
			}
		}
		double a=temp[0];
		return a;
	}
	
	/**
	 *检查数里面是否已经存在省份
	 * @param pr 省份
	 * @param pro 全国省份数组
	 * @return true 不存在  false存在
	 */
	public static boolean check(String pr,String[] pro){
		boolean falg=true;
		for(int i=0;i<pro.length;i++){
			if(pr.equals(pro[i])){
				falg=false;
				return falg;
				
			}
		}
		return falg;
	}
	
	
	
	
	
	//对总分数 进行选择排序  
		/**
		 * 
		 * @param temp 要排序数组
		 * @return 从大到小的数组
		 */
		public static void sortScoreMaxToMin(double[] temp,int len){
			
			for(int i=0;i<len-1;i++){
				for(int j=i+1;j<len;j++){
					double falg=0;
					if(temp[i]<temp[j]){
						falg=temp[i];
						temp[i]=temp[j];
						temp[j]=falg;
					}
				}
			}
		}
	
}
